import Pyro4
import sqlite3
import vue as v
import socket
import sys

sys.path.append("../Errors")
sys.path.append("../Generation-Galaxie")
sys.path.append("../Objets-Ali")
#import Planete
import Galaxie
import entite
import joueur

import OrionErrors

class Modele():
    def __init__(self, parent):
        self.joueur = "rien"
        self.partieDebutee = 0
        self.parent = parent
        #self.action = Action(self,self.parent.vue.frameCourant,self.parent.vue.uniteCourrante.id,self.parent.vue.uniteCourrante.systSolaire,self.parent.vue.uniteCourrante.planete)
                
    def debutPartie(self):
        #self.planete = Planete.Planete("systemeSolaire",0 , 0, 0, "Vaginnoune", self.parent.getSeed(), 0)
        self.galaxie = Galaxie.Galaxie(self.parent.getSeed(),None)
        self.joueur.emplacement = self.galaxie.listeSystemes[0].listePlanetes[0]
        #monVehicule = entite.Tank("Tank", 400, 40, 40, 40, 0, 0, 0, "Ali", 700, 400, 80, 20, 20, 400, len(self.planete.listeEntites))
        #self.planete.listeEntites.append(monVehicule)
        self.partieDebutee = 1
        
    def getMyIp(self):
        return socket.gethostbyname(socket.gethostname())
        
    
class Controleur():
    def __init__(self):
        self.modele = Modele(self)
        self.vue = v.Vue(self)
        self.enregistre = False
        self.vue.master.mainloop()
    
    def validerLogin(self, ip, nomUtilisateur, motDePasse):
        self.creerConnexion(ip, nomUtilisateur, motDePasse)
        if self.enregistre == True:
            self.modele.joueur = nomUtilisateur #joueur.Joueur(self,nomUtilisateur,nomUtilisateur,motDePasse,0, None)
            self.vue.afficherSalle()
            
    def creerConnexion(self, adresseServeur,nomJoueur, motDePasse):
        try:
            self.serveur = Pyro4.core.Proxy("PYRO:serveur@" + adresseServeur + ":54440") #Creation de la connexion sur le serveur
            connexionReussie = self.serveur.validerLogin(nomJoueur, motDePasse) #Va verifier sur le serveur si les informations de login sont valides
        except Pyro4.errors.CommunicationError:
            print("Le serveur a l'adresse " + adresseServeur + " est introuvable.")
        #except OrionErrors.DoubleConnexionError as dce:
        #    print("test")
        except:
            print("Utilisateur deja connecte a l'aide d'un autre client")
        else:
            if connexionReussie:
                self.nomJoueur = nomJoueur
                self.currentFrame = 0
                self.frameIncrement()
                self.enregistre = True
            else:
                self.message = "Usager " + nomJoueur + " inexistant, mot de passe invalide, ou utilisateur connecte"
               
    def frameIncrement(self):
        if self.modele.partieDebutee:
                self.currentFrame = self.currentFrame + 1
                
        try:               
            actionsAFaire = self.serveur.receptionFrame(self.nomJoueur, self.currentFrame)
            
            if actionsAFaire == "debutPartie":
                self.modele.debutPartie()
                self.vue.afficherPartie()
        except ValueError:
            print("Joueur deconnecte")
        else:
            self.vue.master.after(50, self.frameIncrement)
    
    def creerNouveauCompte(self, nomUtilisateur, motDePasse):
        try: #Verifie si l'usager a bien ete ajoute
            self.serveur.creerNouveauCompte(nomUtilisateur, motDePasse)
        except sqlite3.IntegrityError: #L'exception avertit le client que le nom d'utilisateur existe deja
            print("Impossible d'ajouter l'utilisateur " + nomUtilisateur + ", car il est deja present dans la base de donnees")
            
    def creeListeJoueurs(self):
        return self.serveur.retournerListeJoueurs()
    
    def retirerDeLaListe(self, joueur):
        self.serveur.retirerDeLaListe(joueur)
        
    def insererTexteChat(self,nom,texte):
        self.serveur.insererTexteChat(nom,texte)
        
    def creeListeChat(self):
        return self.serveur.creeListeChat()
    
    def getIpServeur(self):
        return self.serveur.getIp()
    
    def getCreateurPartie(self):
        return self.serveur.getCreateurPartie()
    
    def envoiDebutPartie(self):
        self.serveur.envoiDebutPartie(self.currentFrame)
        
    def getSeed(self):
        return self.serveur.getSeed()
    
    def getMyIp(self):
        return self.modele.getMyIp()
    
    def getJoueurCourant(self):
        return self.modele.joueur

    def envoiDeplacementAuServeur(self,frame,entiteId,systemeID,planeteID,xFinal,yFinal,zFinal):
        controleurServeur.envoiDeplacement(DeplacementAction(frame,entiteId,systemeID,planeteID,xFinal,yFinal,zFinal))


class Action():
    def __init__(self,parent,frame,entiteId,systemeID,planeteID):
        self.parent = parent
        self.frame = frame
        self.entiteId = entiteId
        self.systemeID=systemeID
        self.planeteID=planeteID    


    def effectuerAction(self, listeEntites):
        pass
    
    #Recherche et retourne l'entite concernee avec son id
    def chercherEntite(self):
        for entite in galaxie.listeSystemes[self.systemeID].listePlanetes[self.planeteID].listeEntites:
            if entite.ID==self.entiteId:
                return entite
            
    def chercherPlanete(self):
        for planete in galaxie.listeSystemes[self.systemeID].listePlanetes[self.planeteID]:
            if planete.ID == self.planeteID:
                return planete

    
class ActionDeplacement(Action):
    def __init__( self,parent,frame,entiteId,systemeID,planeteID,xFinal,yFinal,zFinal):
        Action.__init__(parent,frame,entiteId,systemeID,planeteID)
        self.xFinal=xFinal
        self.yFinal=yFinal
        self.zFinal=zFinal
        
    def effectuerAction(self):
        entite = chercherUnite()
        #entite.deplacement()
        
class ActionChangementPlanete(Action):
    def __init__(self,parent,frame,entiteId,systemID,planeteID):
        Action.__init__(parent,frame,entiteId,systemID,planeteID)
        
        
        
        if self.planeteID != None:
            self.parent.parent.vue.uniteCourrante[5] = self.chercherPlanete.posX + 1
            self.parent.parent.vue.uniteCourrante[6] = self.chercherPlanete.posY + 1
            self.parent.parent.vue.uniteCourrante[7] = self.chercherPlanete.posZ + 1
            self.parent.parent.vue.uniteCourrante[9] == None    
            
        
        elif self.planeteID == None:
            self.parent.parent.vue.uniteCourrante[8] = self.planeteID
    
        
if __name__ == "__main__":
    controleur = Controleur()